package com.freesky.common.utils;

/**
 * 数据脱敏工具类
 */
public class DesensitizedUtil {
    
    /**
     * 手机号码脱敏
     * 规则：保留前3位和后4位，中间用*代替
     * 例如：18812345678 -> 188****5678
     */
    public static String maskPhone(String phone) {
        if (StringUtils.isEmpty(phone)) {
            return phone;
        }
        return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
    }

    /**
     * 用户姓名脱敏
     * 规则：
     * 1. 姓名长度为2位，显示第一位，最后一位用*代替
     * 2. 姓名长度大于2位，显示第一位，最后一位，中间用*代替
     * 例如：张三 -> 张*，张三丰 -> 张*丰
     */
    public static String maskName(String name) {
        if (StringUtils.isEmpty(name)) {
            return name;
        }
        int len = name.length();
        if (len < 2) {
            return name;
        } else if (len == 2) {
            return name.substring(0, 1) + "*";
        } else {
            StringBuilder sb = new StringBuilder();
            sb.append(name.charAt(0));
            for (int i = 1; i < len - 1; i++) {
                sb.append("*");
            }
            sb.append(name.charAt(len - 1));
            return sb.toString();
        }
    }

    /**
     * 邮箱脱敏
     * 规则：邮箱前缀仅显示第一个字母，其他隐藏，@及后面的地址显示
     * 例如：test@163.com -> t***@163.com
     */
    public static String maskEmail(String email) {
        if (StringUtils.isEmpty(email)) {
            return email;
        }
        int atIndex = email.indexOf('@');
        if (atIndex <= 1) {
            return email;
        }
        StringBuilder sb = new StringBuilder();
        sb.append(email.charAt(0));
        for (int i = 1; i < atIndex; i++) {
            sb.append("*");
        }
        sb.append(email.substring(atIndex));
        return sb.toString();
    }

    /**
     * 身份证脱敏
     * 规则：显示前6位和后4位，中间用*代替
     * 例如：330681199908230202 -> 330681********0202
     */
    public static String maskIdCard(String idCard) {
        if (StringUtils.isEmpty(idCard)) {
            return idCard;
        }
        return idCard.replaceAll("(\\d{6})\\d{8}(\\d{4})", "$1********$2");
    }

    /**
     * 银行卡号脱敏
     * 规则：显示前6位和后4位，中间用*代替
     * 例如：6228480402564890018 -> 622848********0018
     */
    public static String maskBankCard(String bankCard) {
        if (StringUtils.isEmpty(bankCard)) {
            return bankCard;
        }
        return bankCard.replaceAll("(\\d{6})\\d{8,12}(\\d{4})", "$1********$2");
    }

    /**
     * 地址脱敏
     * 规则：只显示到地区，不显示详细地址，地区结尾用*代替
     * 例如：浙江省杭州市西湖区黄姑山路1号 -> 浙江省杭州市西湖区*****
     */
    public static String maskAddress(String address) {
        if (StringUtils.isEmpty(address)) {
            return address;
        }
        int length = address.length();
        if (length <= 8) {
            return address;
        }
        // 找到最后一个区或县的位置
        int endIndex = address.lastIndexOf("区");
        if (endIndex == -1) {
            endIndex = address.lastIndexOf("县");
        }
        if (endIndex == -1) {
            endIndex = 8;
        } else {
            endIndex += 1;
        }
        
        StringBuilder sb = new StringBuilder(address.substring(0, endIndex));
        int remainLength = length - endIndex;
        for (int i = 0; i < remainLength; i++) {
            sb.append("*");
        }
        return sb.toString();
    }
} 